// run: $exec < input
// opt: 0
// flag: -g
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>

struct data { int a, b, id; };
int n, m, k;
bool vis[100007];
std::vector<data> da;

int main()
{
	std::ios::sync_with_stdio(false);
	int T; std::cin >> T;
	while (T--) {
		std::cin >> n >> k >> m;
		std::fill(vis, vis + n, false);
		da.resize(n);
		for (int i = 0; i < n; i++) {
			std::cin >> da[i].a >> da[i].b;
			da[i].id = i;
		}
		std::sort(da.begin(), da.end(), [](data const & a, data const & b) {
					return a.b < b.b || (a.b == b.b && a.a > b.a);
				});
		auto cmp = [](data const & a, data const & b) {
			return a.a - a.b > b.a - b.b;
		};
		std::priority_queue<data, std::vector<data>, decltype(cmp)> pq(cmp);
		int ans = 0, i = 0;
		for (; i < k && m >= da[i].b; m -= da[i++].b, ans++)
			pq.push(da[i]);
		if (ans < k) { std::cout << ans << '\n'; continue; }

		auto da2 = da;
		std::sort(da.begin() + i, da.end(), [](data const & a, data const & b) {
					return a.a < b.a || (a.a == b.a && a.b < b.b);
				});
		for (int j = i; j < n || i < n; ) {
			while (vis[da[j].id] && j < n) j++;
			while (vis[da[i].id] && i < n) i++;
			if (pq.empty()) {
				if (m < da[j].a) break;
				ans++;
				m -= da[j].a;
				vis[da[j++].id] = true;
			} else {
				auto now = pq.top();
				if (da[j].a < da[i].b + now.a - now.b) {
					if (m < da[j].a) break;
					ans++;
					m -= da[j].a;
					vis[da[j++].id] = true;
				} else {
					if (m < da[i].b + now.a - now.b) break;
					pq.pop(); pq.push(da[i]);
					ans++;
					m -= da[i].b + now.a - now.b;
					vis[da[i++].id] = true;
				}
			}
		}
		std::cout << ans << '\n';
	}
}

